package com.mszlu.blog.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mszlu.blog.dao.mapper.TagMapper;
import com.mszlu.blog.dao.pojo.Tag;
import com.mszlu.blog.service.TagService;
import com.mszlu.blog.vo.Result;
import com.mszlu.blog.vo.TagVo;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author linKe
 */
@Service
public class TagServiceImpl implements TagService {

    @Resource
    private TagMapper tagMapper;


    /**
     * 将标签实体类 复制为视图展示对象
     * @param tag 标签实体类
     * @return  tagVo
     */
    public TagVo copy(Tag tag){
        TagVo tagVo = new TagVo();
        //BeanUtils 系统工具转换
        BeanUtils.copyProperties(tag,tagVo);
        //设置 视图对象ID  因为vo的id为string类型
        //String.valueOf 防止空指针异常
        tagVo.setId(String.valueOf(tag.getId()));
        return tagVo;
    }


    /**
     * 将实体类的标签列表  复制成vo的显示列表
     * @param tagList   原始标签列表
     * @return tagVoList
     */
    public List<TagVo> copyList(List<Tag> tagList){
        return tagList.stream().map(this::copy).collect(Collectors.toList());
       /*
       用流的方式返回
       List<TagVo> tagVoList = new ArrayList<>();
        for (Tag tag : tagList) {
            tagVoList.add(copy(tag));
        }
        return tagVoList;*/
    }


    @Override
    public List<TagVo> findTagsByArticleId(Long articleId) {
        //mybatisPlus 无法进行多表查询
        List<Tag> tags = tagMapper.findTagsByArticleId(articleId);
        return copyList(tags);
    }



    /**
     * 1. 标签所拥有的文章数量最多 最热标签
     * 2. 查询 根据tag_id 分组 计数，从大到小 排列 取前 limit个
     * Result.success(tagList); 返回标签id和昵称 结果集
     */
    @Override
    public Result hots(int limit) {
        List<Long> tagIds = tagMapper.findHotsTagIds(limit);

        if (CollectionUtils.isEmpty(tagIds)){
            return Result.success(Collections.emptyList());
        }
        //需求的是 tagId 和 tagName  Tag对象
        //select * from tag where id in (1,2,3,4)
        List<Tag> tagList = tagMapper.findTagsByTagIds(tagIds);
        return Result.success(tagList);
    }

    @Override
    public Result findAll() {
        LambdaQueryWrapper<Tag> queryWrapper = new LambdaQueryWrapper<>();
        //查询标签id 和标签名称  文章分类中的显示
        queryWrapper.select(Tag::getId,Tag::getTagName);
        List<Tag> tags = this.tagMapper.selectList(queryWrapper);
        return Result.success(copyList(tags));
    }

    @Override
    public Result findAllDetail() {
        LambdaQueryWrapper<Tag> queryWrapper = new LambdaQueryWrapper<>();
        //插叙所有字段
        List<Tag> tags = this.tagMapper.selectList(queryWrapper);
        return Result.success(copyList(tags));
    }

    @Override
    public Result findDetailById(Long id) {
        //返回tagVo对象
        Tag tag = tagMapper.selectById(id);
        return Result.success(copy(tag));
    }

}
